#pragma once

#include <iostream>
#include <string>

#define Die(code)   \
    do              \
    {               \
        exit(code); \
    } while (0)

#define CONV(v) (struct sockaddr *)(v)

enum
{
    USAGE_ERR = 1,
    SOCKET_ERR,
    BIND_ERR,
    LISTEN_ERR
};

const int gdefaultsockfd = -1;
const int gbacklog = 8;

// 1. 正常字符串 2. out空串&&返回值是true  3. out空串&&返回值是flase
bool ParseOneLine(std::string &str, std::string *out, const std::string &sep)
{
    auto pos = str.find(sep);
    if (pos == std::string::npos)
        return false;
    *out = str.substr(0, pos);
    str.erase(0, pos + sep.size());
    return true;
}

// Connection: keep-alive
bool SplitLine(const std::string &header, const std::string &sep, std::string *key, std::string *value)
{
    auto pos = header.find(sep);
    if (pos == std::string::npos)
        return false;
    *key = header.substr(0, pos);
    *value = header.substr(pos+sep.size());
    return true;
}

// #pragma once

// #include <iostream>
// // #include <string>

// #define Die(code)   \
//     do              \
//     {               \
//         exit(code); \
//     } while (0)

// #define CONV(v) (struct sockaddr *)(v)

// enum 
// {
//     USAGE_ERR = 1,
//     SOCKET_ERR,
//     BIND_ERR,
//     LISTEN_ERR,
//     CONNECT_ERR,
// };

// const int gdefualtsockfd = -1;
// const int gbacklog = 8;

// bool ParseOneLine(std::string &str, std::string* out, const std::string &sep)
// {
//     auto pos = str.find(sep);
//     if(pos == std::string::npos){
//         return false;
//     }
//     out = str.substr(0, pos);
//     str.erase(0, pos + sep.size());
//     return true;
// }


// bool SplitLine(const std::string &line, const std::string sep, std::string *k, std::string *v)
// {
//     auto pos = line.find(sep);
//     if(pos == std::string::npos) 
//         return false;
//     *k = line.substr(0, pos);
//     *v = line.substr(pos + sep.size());
//     return true;
// }


// bool ParseHeaderkv(const std::string &str, const std::string &sep)

// #pragma once
// #include <iostream>




// #define Die(code)   \
//     do              \
//     {               \
//         exit(code); \
//     } while (0);

// enum err{
//     USE_ERR,
//     SOCK_ERR,
//     BIND_ERR,
// };

// #define CONV(v) (struct sockaddr*)(v)
